import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/*
*Leetcode 811
* >网站域名 "discuss.leetcode.com" 由多个子域名组成。
* 顶级域名为 "com" ，二级域名为 "leetcode.com" ，最低一级为 "discuss.leetcode.com" 。
* 当访问域名 "discuss.leetcode.com" 时，同时也会隐式访问其父域名 "leetcode.com" 以及 "com" 。
* 计数配对域名 是遵循 "rep d1.d2.d3" 或 "rep d1.d2" 格式的一个域名表示
* 其中 rep 表示访问域名的次数，d1.d2.d3 为域名本身。
*
例如
* "9001 discuss.leetcode.com" 就是一个 计数配对域名 ，表示 discuss.leetcode.com 被访问了 9001 次。

* 给你一个 计数配对域名 组成的数组 cpdomains ，解析得到输入中每个子域名对应的 计数配对域名 ，并以数组形式返回。可以按 任意顺序 返回答案。
*

输入：cpdomains = ["900 google.mail.com", "50 yahoo.com", "1 intel.mail.com", "5 wiki.org"]
输出：["901 mail.com","50 yahoo.com","900 google.mail.com","5 wiki.org","5 org","1 intel.mail.com","951 com"]
解释：按照前文描述，会访问 "google.mail.com" 900 次，"yahoo.com" 50 次，"intel.mail.com" 1 次，"wiki.org" 5 次。
而对于父域名，会访问 "mail.com" 900 + 1 = 901 次，"com" 900 + 50 + 1 = 951 次，和 "org" 5 次。


* */
public class Domain {
        public List<String> subdomainVisits(String[] cpdomains) {
            Map<String,Integer> result = new HashMap();
            List<String> res = new ArrayList();
            for (String s:cpdomains){
                int spacePos = s.indexOf(' ');
                String sdomain = s.substring(spacePos+1); //domain
                int srep = Integer.parseInt(s.substring(0,spacePos)); // rep
                //getOrD 有value则取，否则取默认值0

                //子域名
                String[] subdomain = sdomain.split("\\.");
                String iterateString = "";
                for(int i=subdomain.length-1;i>=0;i--){
                    String temp = subdomain[i];
                    if (i==subdomain.length-1){
                        iterateString = temp + iterateString;
                        result.put(iterateString,result.getOrDefault(iterateString,0)+srep);
                    }else{
                        iterateString = temp + "." + iterateString;
                        result.put(iterateString,result.getOrDefault(iterateString,0)+srep);
                    }
                }

            }// 把hash拼成 value key的数组

            result.forEach((key,value)->{
                String tem = value+" "+key;
                res.add(tem);
            });
            return res;

        }

}
